package com.cpimex.eprice.model;

import java.sql.Statement;
import com.cpimex.eprice.bean.PreciosBean;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import java.sql.Date;
import java.text.NumberFormat;
import java.lang.String;


/**
 *
 * 
 * 
 * @author Luis
 *
 */
public class Precios {
	
	private final static boolean DEBUG = false;
    private static NumberFormat nf = NumberFormat.getInstance();
    static{
        nf.setMaximumFractionDigits(5);
        nf.setMinimumFractionDigits(5);
    }
//  level 5 2009 07 25 Manejar 4 decimales en precios y flete
	private static NumberFormat nf4 = NumberFormat.getInstance();
	static {
		nf4.setMaximumFractionDigits(4);
		nf4.setMinimumFractionDigits(4);
	}
    
    /**
     * 
     * 
     * @param stmt_tipoCambio
     * @return String
     * @throws SQLException
     */
    public static String tipoCambio( Statement stmt_tipoCambio ) throws SQLException {
        String str_retVal = "";
        String str_tipoCambio =
                " set language english                                    " +
                " select venta_tipoC as tipo_cambio                       " +
                " from	 ep_vw_tipoCambio                                 " +
                " where	 fecha_tipoC = convert( varchar, getDate(), 111 ) ";
        ResultSet rs_tipoCambio = stmt_tipoCambio.executeQuery(str_tipoCambio);
        if( rs_tipoCambio.next() ){
            str_retVal = nf.format( rs_tipoCambio.getDouble("tipo_cambio") );
        }
        return str_retVal;
    }
    
    
    /**
     * 
     * 
     * @param stmt_tipoCambio
     * @return String
     * @throws SQLException
     */
    public static double tipoCambio( Connection conn ) throws SQLException {
        double dbl_retVal = 0.00f;
        String str_tipoCambio =
                " set language english " +
                " select venta_tipoC as tipo_cambio " +
                " from	 ep_vw_tipoCambio " +
                " where	 fecha_tipoC = convert( varchar, getDate(), 111 ) ";
        ResultSet rs_tipoCambio = conn.createStatement().executeQuery(str_tipoCambio);
        if( rs_tipoCambio.next() ){
        	dbl_retVal = rs_tipoCambio.getDouble("tipo_cambio");
        }
        return dbl_retVal;
    }
    
    
    /**
     * 
     * @param rs_precios
     * @param str_moneda
     * @return PreciosBean
     * @throws SQLException
     */
    private static PreciosBean llenarPreciosActuales( ResultSet rs_precios, String str_moneda ) throws SQLException {
        // System.out.println(" MONEDA " + str_moneda);
    	
    	PreciosBean precios_retVal = null;

        double dbl_precio;
        double dbl_flete;
        Date   dte_fechaInicio;
        Calendar cal_fechaInicio;
        Date   dte_fechaExp;
        Calendar cal_fechaExp;
        String str_diasCredito;
       //Dario 2010-07-07
        String precio;
        String flete;
//      level 5 2009 07 27 INICIO Manejar 4 decimales en precios y flete
       //Dario 2010-07-07
        precio = nf4.format(rs_precios.getDouble("precio"));
        precio = precio.replaceAll(",","");
        dbl_precio = Double.parseDouble(precio);
        
      
        flete = nf4.format(rs_precios.getDouble("flete"));
        flete = flete.replaceAll(",","");
        dbl_flete = Double.parseDouble(flete);
                
//      level 5 2009 07 27 FIN Manejar 4 decimales en precios y flete
        dte_fechaInicio = rs_precios.getDate("fechaInicio");
        if( dte_fechaInicio != null ){
            cal_fechaInicio = Calendar.getInstance();
            cal_fechaInicio.setTime(dte_fechaInicio);
        }else{ cal_fechaInicio = null;}
        dte_fechaExp = rs_precios.getDate("fechaExp");
        if( dte_fechaExp != null ){
            cal_fechaExp = Calendar.getInstance();
            cal_fechaExp.setTime(dte_fechaExp);
        }else cal_fechaExp = null;
        str_diasCredito = rs_precios.getString("diasCredito");
        precios_retVal = new PreciosBean(dbl_precio, dbl_flete, cal_fechaInicio, cal_fechaExp, str_diasCredito );
        return precios_retVal;
    }

    
    /**
     * Muestra Precio Actual por cliente - producto
     * 
     * @param stmt_precios
     * @param str_cliente
     * @param str_producto
     * @param int_logistica
     * @param str_moneda
     * @return PreciosBean
     * @throws SQLException
     */
    public static PreciosBean preciosActual( 
    		Statement stmt_precios, 
    		String str_cliente, 
    		String str_producto, 
    		int int_logistica, 
    		String str_moneda ) throws SQLException {
        
    	// System.out.println(str_moneda);
    	
    	PreciosBean precios = null;
        String str_precios =
                " select   top 1 "+
                "          precioSol_detSol as precio,                 " +
                "          fleteLista_detSol as flete,                 " +
                "          fechaInicio_detSol as fechaInicio,          " +
                "          fechaExp_detSol as fechaExp,                " +
                "          diasCredito_detSol as diasCredito           " +
                " from	   ep_detalleSolicitud                         " +
                " where	   codigoCli_detSol = '"+str_cliente+"' and    " +
                "          codigoPro_detSol = '"+str_producto+"' and   " +
                "          logistica_detSol =  "+int_logistica+" and   " +
                "          id_estatus = 5                              " +
                " order by fechaInicio_detSol desc                     " ;
        
        
        ResultSet rs_precios = stmt_precios.executeQuery(str_precios);
        if( rs_precios.next() ){
            precios = llenarPreciosActuales( rs_precios, str_moneda );
        }else{
        	
            rs_precios.close();
            str_precios =
                    " select precio_pv as precio,                   " +
                    "        0 as flete,                            " +
                    "        fechaInicio_pv as fechaInicio,         " +
                    "        fechaExp_pv as fechaExp,               " +
                    "        condiciones_cli as diasCredito         " +
                    " from   ep_vw_precioVigente                    " +
                    "                inner join ep_vw_cliente       " +
                    "                on codigo_cli = codigoCli_pv   " +
                    " where  codigoCli_pv = '"+str_cliente+"' and   " +
                    "        codigoPro_pv = '"+str_producto+"' and  " +
                    "        logistica_pv =  "+int_logistica+"      " +
                    " order by fechaInicio_pv desc                  ";
            
            rs_precios = stmt_precios.executeQuery(str_precios);
            if( rs_precios.next() ){
                precios = llenarPreciosActuales( rs_precios, str_moneda );
            }
            if(DEBUG){System.out.println(str_precios);}
        }
        return precios;
    }

    
    /**
     * 
     * @param stmt_precioCP
     * @param str_segmento
     * @param str_cliente
     * @param str_producto
     * @param dbl_toneladas
     * @return double
     * @throws SQLException
     */
    public static double precioClienteProducto( 
    		Statement stmt_precioCP, 
    		String str_segmento, 
    		String str_cliente, 
    		String str_producto, 
    		double dbl_toneladas ) throws SQLException {
    	
        double dbl_retVal = 0;
        String str_precioCP =
            " select  sum(cantidad_precioL) as cantidad_precioL " +
            " from   (                                          " +
            "  select   cantidad_precioL                         " +
            "  from    ep_precioLista                           " +
            "  where                                            " ;
        if( dbl_toneladas == 0 ){
            str_precioCP +=
                    "  ( " +
                    "     select   (isnull( sum( toneladas_vta ), 0 )/12) as toneladas_vta " +
                    "     from     ep_vw_ventaClienteProducto                              " +
                    "     where    codigoCli_vta =  '"+ str_cliente  +"' and               " +
                    "              codigoProd_vta = '"+ str_producto +"'                   " +
                    " )                                                                    " ;
        }else{
            str_precioCP += dbl_toneladas;
        }
        str_precioCP += " between rangomin_precioL and ( case when (rangomax_precioL = -1 OR rangomax_precioL = rangomin_precioL) then 100000000 else rangomax_precioL end ) and " +
                "         codigoSeg_precioL = '"+str_segmento+"' and     " +
                "         id_grupo = (                                   " +
                "                select	top 1 id_grupo                   " +
                "                from	ep_vw_producto                   " +
                "                where	codigo_prod = '"+str_producto+"' " +
                "         )                                              " +
                "  union                                                 " +
                "  select 	costo_envase as cantidad_precioL             " +
                "  from 	ep_vw_producto                               " +
                "  where 	codigo_prod = '"+str_producto+"'             " +
                " ) as tmp                                               " ;
        
        if(DEBUG){ System.out.println("precioClienteProducto " + str_precioCP);}
        
        ResultSet rs_precioCP = stmt_precioCP.executeQuery(str_precioCP);
        if( rs_precioCP.next() ) {
            dbl_retVal = rs_precioCP.getDouble("cantidad_precioL");
        }
        return dbl_retVal;
    }
    
    
    
    /**
     * Cliente Producto para cotizador concosumo en cero
     * 
     * @param stmt_precioCP
     * @param str_segmento
     * @param str_cliente
     * @param str_producto
     * @param dbl_toneladas
     * @return double
     * @throws SQLException
     */
    public static double precioClienteProductoCotiza( 
    		Statement stmt_precioCP, 
    		String str_segmento, 
    		String str_cliente, 
    		String str_producto, 
    		double dbl_toneladas ) throws SQLException {
    	
        double dbl_retVal = 0;
        String str_precioCP =
            " select  sum(cantidad_precioL) as cantidad_precioL " +
            " from   (                                          " +
            "  select  cantidad_precioL                         " +
            "  from    ep_precioLista                           " +
            "  where                                            " ;
                   
        str_precioCP += dbl_toneladas;
        
        str_precioCP += " between rangomin_precioL and ( case " +
        		"                                            when (rangomax_precioL = -1 OR rangomax_precioL = rangomin_precioL) " +
        		"														then 100000000 " +
        		"														else rangomax_precioL " +
        		"											end ) and " +
                "         codigoSeg_precioL = '"+str_segmento+"' and      " +
                "         id_grupo = (                                    " +
                "                select	id_grupo                          " +
                "                from	ep_vw_producto                    " +
                "                where	codigo_prod = '"+str_producto+"'  " +
                "         )                                               " +
                "  union                                                  " +
                "  select 	costo_envase as cantidad_precioL              " +
                "  from 	ep_vw_producto                                " +
                "  where 	codigo_prod = '"+str_producto+"'              " +
                " ) as tmp                                                ";
        
        if(DEBUG){ System.out.println("precioClienteProducto: " + str_precioCP);}
        
        ResultSet rs_precioCP = stmt_precioCP.executeQuery(str_precioCP);
        if( rs_precioCP.next() ) {
            dbl_retVal = rs_precioCP.getDouble("cantidad_precioL");
        }
        return dbl_retVal;
    }
    

    	
    /**
     * 
     * @param stmt_precioCP
     * @param str_segmento
     * @param str_cliente
     * @param str_producto
     * @return String
     * @throws SQLException
     */
    public static String precioClienteProductos( 
    		Statement stmt_precioCP, 
    		String str_segmento, 
    		String str_cliente, 
    		String str_producto ) throws SQLException {
        String str_retVal = "0.0";
        String str_precioCP =
            " select  sum(cantidad_precioL) as cantidad_precioL "+
            " from   ( "+
            "  select  cantidad_precioL " +
            "  from    ep_precioLista " +
            "  where   ( select isnull( sum(toneladas_vta), 0 )/12 " +
            "           from   ( " +
            "                   select   sum(toneladas_vta) as toneladas_vta " +
            "                   from     ep_vw_ventaClienteProducto  " +
            "                   where    codigoCli_vta = '"+str_cliente+"'  " +
            "                   group by mes_vta,  " +
            "                            anio_vta " +
            "                  ) as t "+
            "         ) between rangomin_precioL and ( case when (rangomax_precioL = -1 OR rangomax_precioL = rangomin_precioL) then 100000000 else rangomax_precioL end ) and " +
            "          codigoSeg_precioL = '"+str_segmento+"' and " +
            "          id_grupo =( " +
            "                select	top 1 id_grupo " +
            "                from	ep_vw_producto " +
            "                where	codigo_prod = '"+str_producto+"' " +
            "          ) " +
            "  union " +
            "  select 	costo_envase as cantidad_precioL " +
            "  from 	ep_vw_producto " +
            "  where 	codigo_prod = '"+str_producto+"' "+
            " ) as tmp ";
        
        if(DEBUG){ System.out.println("precioClienteProductos: " + str_precioCP);}
        ResultSet rs_precioCP = stmt_precioCP.executeQuery(str_precioCP);
        if( rs_precioCP.next() ) {
//          level 5 2009 07 25 Manejar 4 decimales en precios y flete
            str_retVal = nf4.format( rs_precioCP.getDouble("cantidad_precioL") );
        }
        return str_retVal;
    }
    
    
    /**
     * 
     * @param stmt_precioCP
     * @param str_segmento
     * @param str_grupo
     * @param str_producto
     * @return String
     * @throws SQLException
     */
    public static String precioGrupoProducto( Statement stmt_precioCP, String str_segmento, String str_grupo, String str_producto ) throws SQLException {
        String str_retVal = "0.0";
        String str_precioCP =
            " select  sum(cantidad_precioL) as cantidad_precioL "+
            " from   ( "+
            "  select  cantidad_precioL " +
            "  from    ep_precioLista " +
            "  where   ( select isnull( avg(toneladas_vta), 0 ) " +
            "           from   ( " +
            "                   select   sum(toneladas_vta) as toneladas_vta " +
            "                   from     ep_vw_grupoClientes g  " +
            "                                  inner join ep_vw_cliente c "+
            "                                  on g.codigo_grpCli = c.grupo_cli and "+
            "                                     g.ruta_grpCli = c.vendedor_cli "+
            "                                  inner join ep_vw_ventaClienteProducto vcp "+
            "                                  on c.codigo_cli = vcp.codigoCli_vta "+
            "                   where    codigo_grpCli = '" + str_grupo + "'  " +
            "                   group by mes_vta,  " +
            "                            anio_vta " +
            "                  ) as t "+
            "         ) between rangomin_precioL and ( case when (rangomax_precioL = -1 OR rangomax_precioL = rangomin_precioL) then 100000000 else rangomax_precioL end ) and " +
            "          codigoSeg_precioL = '"+str_segmento+"' and " +
            "          id_grupo =( " +
            "                select	id_grupo " +
            "                from	ep_vw_producto " +
            "                where	codigo_prod = '"+str_producto+"' " +
            "          ) " +
            "  union " +
            "  select 	costo_envase as cantidad_precioL " +
            "  from 	ep_vw_producto " +
            "  where 	codigo_prod = '"+str_producto+"' "+
            " ) as tmp ";
        if(DEBUG){ System.out.println("precioGrupoProducto " + str_precioCP);}
        ResultSet rs_precioCP = stmt_precioCP.executeQuery(str_precioCP);
        if( rs_precioCP.next() ) {
//          level 5 2009 07 25 Manejar 4 decimales en precios y flete
            str_retVal = nf4.format( rs_precioCP.getDouble("cantidad_precioL") );
        }

        return str_retVal;
    }

    
    
    /**
     * 
     * @param stmt_precioCP
     * @param str_segmento
     * @param str_cliente
     * @param str_producto
     * @return String
     * @throws SQLException
     */
    public static String precioGrupoProductos( Statement stmt_precioCP, String str_segmento, String str_cliente, String str_producto ) throws SQLException {
       // (Boolean.valueOf("true")).booleanValue();
    	
//      level 5 2009 07 25 Manejar 4 decimales en precios y flete
    	//String str_retVal = "0.00000";
    	String str_retVal = "0.0000";
        String str_grupo =
            " select grupo_cli "+
            " from   ep_vw_cliente "+
            " where  codigo_cli = '"+str_cliente+"' and "+
            "        grupo_cli is not null and "+
            "        ltrim(grupo_cli) <> ''";
        ResultSet rs_grupo = stmt_precioCP.executeQuery(str_grupo);
        if( rs_grupo.next() ){
            String str_codGrupo = rs_grupo.getString("grupo_cli");
            String str_precioCP =
                    " select  sum(cantidad_precioL) as cantidad_precioL "+
                    " from   ( "+
                    "  select  cantidad_precioL " +
                    "  from    ep_precioLista " +
                    "  where   ( select isnull( avg(toneladas_vta), 0 ) " +
                    "           from   ( " +
                    "                   select   sum(toneladas_vta) as toneladas_vta " +
                    "                   from     ep_vw_grupoClientes g  " +
                    "                                  inner join ep_vw_cliente c "+
                    "                                  on g.codigo_grpCli = c.grupo_cli and "+
                    "                                     g.ruta_grpCli = c.vendedor_cli "+
                    "                                  inner join ep_vw_ventaClienteProducto vcp "+
                    "                                  on c.codigo_cli = vcp.codigoCli_vta "+
                    "                   where    codigo_grpCli = '" + str_codGrupo + "'  " +
                    "                   group by mes_vta,  " +
                    "                            anio_vta " +
                    "                  ) as t "+
                    "         ) between rangomin_precioL and ( case when (rangomax_precioL = -1 OR rangomax_precioL = rangomin_precioL) then 100000000 else rangomax_precioL end ) and " +
                    "          codigoSeg_precioL = '"+str_segmento+"' and " +
                    "          id_grupo =( " +
                    "                select	top 1 id_grupo " +
                    "                from	ep_vw_producto " +
                    "                where	codigo_prod = '"+str_producto+"' " +
                    "          ) " +
                    "  union " +
                    "  select 	costo_envase as cantidad_precioL " +
                    "  from 	ep_vw_producto " +
                    "  where 	codigo_prod = '" + str_producto + "' " +
                    " ) as tmp ";
            if(DEBUG){ System.out.println("precioGrupoProductos " + str_precioCP);}
            ResultSet rs_precioCP = stmt_precioCP.executeQuery(str_precioCP);
            if( rs_precioCP.next() ) {
//              level 5 2009 07 25 Manejar 4 decimales en precios y flete
                str_retVal = nf4.format( rs_precioCP.getDouble("cantidad_precioL") );
            }
            rs_precioCP.close();
        }
        return str_retVal;
    }
}
